﻿//----------------------------------------------------------------
// Desc: 
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2010-06-11
//
// Update Date : 
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
//----------------------------------------------------------------
#pragma once


//----------------------------------------------------------------
//
//----------------------------------------------------------------
class IFFontData : public IFRefObject
{
public:
    // 以下变量不可以直接修改，仅供访问
    ACHAR szFontName[eCD_MaxFontName];// 字体名或者字体文件路径
    BYTE nFontSize;                 // 字体尺寸
    bool bBold;                     // 是否粗体
    bool bSmooth;                   // 是否平滑
    BYTE nFontHeight;               // 单个字的象素高度（字符的宽度请用IFFont->QueryXXXXX相关函数查询）
    BYTE nBoldLevel;                // 粗体字时的粗细级别（默认3，越大越粗）

    // 修改渲染标记，默认eRF_Default2D
    virtual DWORD GetRenderFlags() = 0;
    virtual void SetRenderFlags(DWORD flags) = 0;
};


struct IFFontQuery
{
    size_t nCharCount;              // 该行字符数量（不是内存字节数）
    size_t nPixelWidth;             // 该行所占象素宽度（行高就是字体高度，因此不返回）
};
typedef FVector< IFFontQuery > FV_FONT_QUERY;


struct IFFontEdit
{
    int local;                      // 输入该字符所在之串中的位置
    float csx, csy;                 // 返回该光标所在屏幕坐标
};


//----------------------------------------------------------------
//
//----------------------------------------------------------------
class IFFont : public IFService
{
protected:
    explicit IFFont()
        :IFService(0)
    {}

public:
    // 消毁资源
    // .fontID: 被消毁的资源ID
    virtual void Destroy(FIDFONT fontID) = 0;
    // 消毁资源
    // .fontID: 被消毁的资源ID，消毁以后并自动将id设为eCD_DefFontID
    virtual void DestroyEx(FIDFONT& fontID) = 0;
    // 创建字体
    // .fontname 字体名
    // .fontsize 字体尺寸
    // .bold 是否粗体
    // .smooth 是否平滑边缘
    // .return 字体ID
    virtual FIDFONT Create(const WCHAR* fontname, BYTE fontsize, bool bold, bool smooth) = 0;
    virtual FIDFONT Create(const ACHAR* fontname, BYTE fontsize, bool bold, bool smooth) = 0;
    // 绘制文字
    // .dx,dy: 屏幕X，Y
    // .pString 输出字符串内容
    //          WCHAR：WINDOWS平台是UNICODE（UTF16LE）、安卓平台是UTF32LE
    //          ACHAR：WINDOWS平台是ANSI（GB2312）、安卓苹果平台是UTF8
    // .fontID 字体ID
    // .fntColor 字体颜色
    // .effect 绘制效果
    // .efcColor 效果颜色
    virtual void DrawTextEx(float dx, float dy, const WCHAR* pString, FIDFONT fontID = eCD_DefFontID, DWORD fntColor = eCD_DefFntColor,
        EF_FONT_EFFECT effect = eFE_Normal, DWORD efcColor = eCD_DefFntEffect) = 0;
    virtual void DrawTextEx(float dx, float dy, const ACHAR* pString, FIDFONT fontID = eCD_DefFontID, DWORD fntColor = eCD_DefFntColor,
        EF_FONT_EFFECT effect = eFE_Normal, DWORD efcColor = eCD_DefFntEffect) = 0;
    // 绘制文字
    // .rc 屏幕区域
    // .pString 输出字符串内容
    //          WCHAR：WINDOWS平台是UNICODE（UTF16LE）、安卓平台是UTF32LE
    //          ACHAR：WINDOWS平台是ANSI（GB2312）、安卓苹果平台是UTF8
    // .fontID 字体ID
    // .fntColor 字体颜色
    // .align 对齐格式，详见EF_FONT_ALIGN
    // .effect 绘制效果
    // .efcColor 效果颜色
    virtual void DrawText(FRect* rc, const WCHAR *pString, FIDFONT fontID = eCD_DefFontID, DWORD fntColor = eCD_DefFntColor,
        DWORD align = eFA_LEFT|eFA_TOP, EF_FONT_EFFECT effect = eFE_Normal, DWORD efcColor = eCD_DefFntEffect) = 0;
    virtual void DrawText(FRect* rc, const ACHAR *pString, FIDFONT fontID = eCD_DefFontID, DWORD fntColor = eCD_DefFntColor,
        DWORD align = eFA_LEFT|eFA_TOP, EF_FONT_EFFECT effect = eFE_Normal, DWORD efcColor = eCD_DefFntEffect) = 0;
    // 绘制渐变字
    // .dx, dy 目标位置
    // .pString 串内容
    //          WCHAR：WINDOWS平台是UNICODE（UTF16LE）、安卓平台是UTF32LE
    //          ACHAR：WINDOWS平台是ANSI（GB2312）、安卓苹果平台是UTF8
    // .fontID 字体ID
    // .c1, c2, c3, c4 分别代表串的四个项点的颜色，分别是左上、左下，右上，右下
    // .is_char true表示每个字的颜色都按这个颜色填充，false则整个串为单位填充颜色
    virtual void DrawGradation(float dx, float dy, const WCHAR* pString, FIDFONT fontID = eCD_DefFontID,
        DWORD c1 = eCD_DefFntColor, DWORD c2 = eCD_DefFntColor, DWORD c3 = eCD_DefFntColor, DWORD c4 = eCD_DefFntColor, EF_FONT_GRAD_MODE fgm = eFGM_Char) = 0;
    virtual void DrawGradation(float dx, float dy, const ACHAR* pString, FIDFONT fontID = eCD_DefFontID,
        DWORD c1 = eCD_DefFntColor, DWORD c2 = eCD_DefFntColor, DWORD c3 = eCD_DefFntColor, DWORD c4 = eCD_DefFntColor, EF_FONT_GRAD_MODE fgm = eFGM_Char) = 0;
    // 查询给定字符串需占屏幕信息（如果一个文字的象素高度请查询IFFontData的nFontHeight）
    // .pString 字符内容
    //          WCHAR：WINDOWS平台是UNICODE（UTF16LE）、安卓平台是UTF32LE
    //          ACHAR：WINDOWS平台是ANSI（GB2312）、安卓苹果平台是UTF8
    // .fontID 字体ID
    // .queryMaxLine 是否只查询象素最宽字串行，否则是查询所有行，此时pvInfo为数组首地址
    // .pvInfo 输出最宽行或者所有行信息
    // .info_count 指明pvInfo数组数量
    // .return 失败表示查询失败，可能是字体不存在
    virtual bool QueryString(const WCHAR *pString, FIDFONT fontID, bool queryMaxLine, IFFontQuery* pvInfo, size_t info_count) = 0;
    virtual bool QueryString(const ACHAR *pString, FIDFONT fontID, bool queryMaxLine, IFFontQuery* pvInfo, size_t info_count) = 0;
    // 查询字体屏幕宽与高
    // .pChar 字符地址 ANSI情况下：英文1个字符，中文2个字符 / UNICODE情况下，英文和中文都只占1个字符
    //          WCHAR：WINDOWS平台是UNICODE（UTF16LE）、安卓平台是UTF32LE
    //          ACHAR：WINDOWS平台是ANSI（GB2312）、安卓苹果平台是UTF8
    // .fontID 字体ID
    // .charWidth 输出该字符所占宽度
    // .charHeight 输出该字符所占高度（实际返回的是IFFontData的nFontHeight）
    // .return 失败表示该字符不占空间或者查询失败，可能是字体不存在
    virtual bool QueryChar(const WCHAR* pChar, FIDFONT fontID, size_t& charWidth, size_t& charHeight) = 0;
    virtual bool QueryChar(const ACHAR* pChar, FIDFONT fontID, size_t& charWidth, size_t& charHeight) = 0;
    // 取指定字体信息
    virtual IFFontData* GetFontData(FIDFONT fontID) = 0;

    // 调试接口，输出字体贴图到文件（不带扩展名，自动PNG格式）
    virtual void __OutputFntTex(FIDFONT id, const ACHAR* dst) = 0;
};